package edu.tfh.s2.ehkbot.gerete.sensoren.simulation;

import java.util.HashMap;
import java.util.Map.Entry;

import edu.tfh.s2.ehkbot.daten.Einstellungen;
import edu.tfh.s2.ehkbot.daten.GeraeteRegistration;
import edu.tfh.s2.ehkbot.gerete.Greifer;
import edu.tfh.s2.ehkbot.gerete.sensoren.Sensor;
import edu.tfh.s2.ehkbot.util.Observer;
import edu.tfh.s2.ehkbot.util.Subject;

/**
 * SensorStorryGreifen kümmert sich um die Simulation des Greifen
 * 
 * @author s2zehn
 */
public class SensorStorryGreife implements Observer {
	private Subject subject = null;

	/**
	 * Setzt das Subjekt welches abgefragt wird wenn update aufgefuden wird.
	 * 
	 * @param subject
	 *            Das Subjekt.
	 */
	public void setSubject(Subject subject) {
		this.subject = subject;
	}

	/**
	 * @see edu.tfh.s2.ehkbot.util.Observer#update()
	 */
	@Override
	public void update() {

		if (subject == null)
			return;
		if (!(subject.getState() instanceof String))
			return;

		String methode = (String) subject.getState();

		/*
		 * Hollt die Grenzwerte die bestimen ob davon ausgegangen werden kann, das etwas gegriffen ist.
		 */
		double istGegrifenKraftGrenzeN = Einstellungen.getInstance().getDoublePropertie(
			"IstGegrifenKraftGrenzeN");
		double istAngesaugtDruckGrenze = Einstellungen.getInstance().getDoublePropertie(
			"IstAngesaugtDruckGrenzeBar");
		double istNahDran = Einstellungen.getInstance().getDoublePropertie("IstNahDranGrenzeMm");

		/*
		 * Hollt sich die Sensoren von GeraeteRegistration die für das Greifen wichtig sind.
		 */
		String sensorNamen[] = { "kraft", "abstands", "saugnapfDruck" };
		String modulName = Greifer.modulName;
		HashMap<String, Sensor> sensoren = GeraeteRegistration.getInstance().findeSensoren(
			modulName,
			sensorNamen);

		/*
		 * Prüft ob es Simulierte Sensoren sind
		 */
		HashMap<String, SensorStateSimulation> sensorenSim = new HashMap<String, SensorStateSimulation>();
		for (Entry<String, Sensor> s : sensoren.entrySet()) {
			if (s.getValue().getState() instanceof SensorStateSimulation)
				sensorenSim.put(s.getKey(), (SensorStateSimulation) s.getValue().getState());
		}
		if (sensorenSim.size() != 3)
			return;

		/*
		 * In wenn Greifer in den Methoden greifen oder gegriffen ist sollen die Sensoren, den fall liefern,
		 * das gegriffen wurde.
		 */
		if (methode.equals("greifen") || methode.equals("gegriffen")) {
			sensorenSim.get("abstands").setMessewertRoh(istNahDran * 0.5);
			sensorenSim.get("kraft").setMessewertRoh(istGegrifenKraftGrenzeN * 1.5);
			sensorenSim.get("saugnapfDruck").setMessewertRoh(istAngesaugtDruckGrenze * 0.5);
		} else {
			sensorenSim.get("abstands").setMessewertRoh(istNahDran * 1.5);
			sensorenSim.get("kraft").setMessewertRoh(istGegrifenKraftGrenzeN * 0);
			sensorenSim.get("saugnapfDruck").setMessewertRoh(istAngesaugtDruckGrenze * 1.5);
		}
	}

}
